package com.cskaoyan.javase.oop.pop12;

/**
 * @description: 使用面向对象完成这个过程
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 使用面向对象把大象放进冰箱
 * //1，打开冰箱门
 * //2，把大象放进去
 * //3，关上冰箱门
 * 首先第一个问题：这个过程几个对象完成？
 * 大象对象，冰箱对象
 * 需不需要一个人对象来开关冰箱？我说不需要
 * 因为类是对对象的共性的抽象，冰箱能不能一个对象就完成关门，大象能不能自己就进冰箱？
 * 我们只需要两个对象
 *
 * 面向对象编程的优缺点：
 *  优点：每个对象之间的行为完全独立
 *  冰箱能做啥 和大象做啥有没有关系？
 *  所以这个时候需求如果改了，我修改大象也好，或者修改冰箱也好，对对方有没有影响？
 *  程序易于扩展，抗修改能力强
 *  所以面向对象常用于大型企业级开发
 *  而C这种就不太适用于做这种开发，c语言效率很高，牵扯到算法的统统是C做的，嵌入式的小程序开发
 *
 *  缺点：对程序员的要求高，如果设计有问题，或者思路不明确，那么程序员可能没办法写出特别优秀的代码
 *  架构问题，程序的架构如果很差，那会比面向过程更难受
 *
 */
public class NewDemo {
    public static void main(String[] args) {
        Fridge f = new Fridge();
        Elephant e = new Elephant();
        e.fridge = f;
        //三步走 调用
        f.openDoor();
        e.intoFridge();
        f.closeDoor();
    }

}

//大象类
class Elephant {
    //属性省略了
    //大象应该可以去判断冰箱的门的状态
    Fridge fridge;

    //写方法 只有一个行为，自己进冰箱
    public void intoFridge() {
        //进冰箱，能不能直接进去，牵扯到两个对象的交互，我要先判断门开了没
        if (fridge.doorState) {
            //如果是true，开门了
            System.out.println("门开了，大象走进了冰箱");
        } else {
            //如果门没开，等开门
            System.out.println("我在等门开进冰箱");
        }
    }
}

//冰箱类
class Fridge {
    //属性，门的状态
    boolean doorState = false; //默认冰箱门是关上的

    //冰箱有两个行为，开关门
    public void openDoor() {
        this.doorState = true;
        System.out.println("冰箱的门打开了");
    }

    public void closeDoor() {
        this.doorState = false;
        System.out.println("冰箱的门关闭了");
    }
}
